import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * Delayed 是 Java 中的一个接口，通常用于延迟任务的调度（例如使用 java.util.concurrent.DelayQueue）
 * 快递订单
 */
public class DelayedTask implements Delayed {

    private final long startTime; // 任务计划开始时间（纳秒）
    private final String taskName; // 任务名称

    public DelayedTask(String taskName, long delayInMilliseconds) {
        this.taskName = taskName;
        this.startTime = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(delayInMilliseconds);
    }

    //它的作用是告诉系统某个延迟任务还有多久可以被执行
    @Override
    public long getDelay(TimeUnit unit) {
        long diff = startTime - System.nanoTime(); // 计算剩余时间（纳秒）
        return unit.convert(diff, TimeUnit.NANOSECONDS); // 转换为目标单位
    }

    @Override
    // 用于比较两个对象的顺序
    public int compareTo(Delayed o) {
        if (this.startTime < ((DelayedTask) o).startTime) {
            return -1;
        } else if (this.startTime > ((DelayedTask) o).startTime) {
            return 1;
        } else {
            return 0;
        }
    }

    @Override
    public String toString() {
        return taskName;
    }

    public static void main(String[] args) throws InterruptedException {
        // 创建一个延迟队列
        DelayQueue<DelayedTask> queue = new DelayQueue<>();
        // 添加延迟任务
        queue.put(new DelayedTask("Task 1", 3000)); // 延迟 3 秒
        queue.put(new DelayedTask("Task 2", 1000)); // 延迟 1 秒
        queue.put(new DelayedTask("Task 3", 5000)); // 延迟 5 秒
        // 消费任务
        while (!queue.isEmpty()) {
            DelayedTask task = queue.take(); // 阻塞直到任务到期
            System.out.println("Executing: " + task);
        }
    }
}